# ==============================================================================
# 模块导入区：导入所有依赖的库和模块
# ==============================================================================
import sys
import random
from hashlib import sha256
from pathlib import Path
from datetime import datetime

from flask import Flask, render_template, request, jsonify
from flask_sqlalchemy import SQLAlchemy
import click
from config import Config  # 导入配置类
from models import db, User, Movie  # 从models导入db实例和模型（关键修正）
from commond import register_commands# 修正模块名：commond→commands（拼写错误）

# ==============================================================================
# 1. Flask应用初始化：创建应用实例，配置基础参数
# ==============================================================================
app = Flask(__name__)
# 加载配置（从Config类读取，包含数据库URI等配置）
app.config.from_object(Config)
# 初始化数据库（关联Flask应用）
db.init_app(app)
# 注册命令行指令（init-db、forge）
register_commands(app)

# ==============================================================================
# 5. 模板全局变量：向所有模板注入公共数据（无需在每个视图函数中传递）
# ==============================================================================
@app.context_processor
def inject_vars():
    """注入全局变量到所有模板中"""
    return {'current_year': datetime.now().year}  # 注入当前年份

# ==============================================================================
# 6. 页面路由：渲染HTML页面（面向用户的页面访问）
# ==============================================================================
@app.route('/')
@app.route('/home')
@app.route('/index')
def index():
    """首页/电影列表页：支持3个访问路径（/、/home、/index）"""
    # 查询所有电影，按ID倒序排列（最新添加的电影在前）
    movies = Movie.query.order_by(Movie.id.desc()).all()
    # 格式化电影数据为字典列表（避免直接传递ORM对象到模板）
    formatted_movies = [{
        'id': m.id, 'title': m.title, 'year': m.year,
        'genre': m.genre, 'rating': m.rating,
        'poster_url': m.poster_url, 'description': m.description
    } for m in movies]
    # 渲染电影列表模板（确保模板路径正确）
    return render_template('pages/movies.html', movies=formatted_movies)

@app.route('/about')
def about():
    """关于页面：渲染关于网站的信息"""
    return render_template('pages/about.html')


@app.route('/movies', methods=['POST'])
def api_add_movie():
    """API接口：添加新电影(仅支持POST请求)"""
    # 获取前端传递的JSON数据 key:value
    data = request.json

    # 校验必填字段（title, year, genre, rating, poster_url）
    required_fields = ['title', 'year', 'genre', 'rating', 'poster_url']
    if not all(k in data for k in required_fields):
        # 缺少字段返回400错误（Bad Request）
        return jsonify({"status": "error", "msg": "缺少必填字段"}), 400

    # 创建电影实例（description字段可选，默认认为“暂无介绍”）
    movie = Movie(
        title=data['title'],
        year=data['year'],
        genre=data['genre'],
        rating=data['rating'],
        poster_url=data['poster_url'],
        description=data.get('description', '暂无介绍'),
        created_at=datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
        updated_at=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    )

    # 提交到数据库
    db.session.add(movie)
    db.session.commit()

    # 返回成功响应（包含新电影的ID）
    return jsonify({"status": "success", "id": movie.id})
# ==============================================================================
# 8. 应用入口：本地开发时运行应用
# ==============================================================================
if __name__ == '__main__':
    # 启动Flask开发服务器（debug=True：开启调试模式，自动重启）
    app.run(debug=True)

